import os
import subprocess
import shutil
import re
from pathlib import Path

def process_pdf_tex_files(template_path, input_dir, output_dir):
    """
    处理目录中的所有.pdf_tex文件，使用模板生成PDF
    
    参数:
    template_path (str): LaTeX模板文件路径
    input_dir (str): 包含.pdf_tex文件的输入目录
    output_dir (str): 输出PDF的目录
    """
    # 创建输出目录（如果不存在）
    Path(output_dir).mkdir(parents=True, exist_ok=True)
    
    # 读取模板内容
    with open(template_path, 'r', encoding='utf-8') as f:
        template_content = f.read()
    
    # 遍历输入目录中的所有.pdf_tex文件
    for filename in os.listdir(input_dir):
        if not filename.endswith('.pdf_tex'):
            continue
            
        # 提取基本文件名（不含扩展名）
        base_name = os.path.splitext(filename)[0]
        print(f"处理文件: {filename}")
        
        # 创建临时工作目录
        temp_dir = Path(f"temp_{base_name}")
        temp_dir.mkdir(exist_ok=True)
        
        try:
            # 1. 复制PDF_TEX文件
            input_file = Path(input_dir) / filename
            shutil.copy(input_file, temp_dir)
            
            # 2. 复制同名的PDF文件（重要补充）
            pdf_file = Path(input_dir) / f"{base_name}.pdf"
            if not pdf_file.exists():
                print(f"警告: 未找到同名PDF文件 {pdf_file.name}，图形可能无法正确渲染")
            else:
                shutil.copy(pdf_file, temp_dir)
            
            # 3. 创建LaTeX文件
            tex_content = template_content.replace(
                r'\input{fig0104.pdf_tex}', 
                f'\\input{{{filename}}}'
            )
            
            # 使用临时文件名避免冲突
            tex_filename = f"temp_{base_name}.tex"
            tex_file = temp_dir / tex_filename
            with open(tex_file, 'w', encoding='utf-8') as f:
                f.write(tex_content)
            
            # 4. 编译LaTeX文件
            compile_tex(temp_dir, tex_filename)
            
            # 5. 重命名并复制生成的PDF到输出目录
            output_filename = f"图{base_name}.pdf"  # 添加"图"字前缀
            generated_pdf = temp_dir / f"temp_{base_name}.pdf"
            pdf_output = Path(output_dir) / output_filename
            
            if generated_pdf.exists():
                shutil.copy(generated_pdf, pdf_output)
                print(f"成功生成: {pdf_output}")
            else:
                print(f"错误: 未生成PDF文件 {generated_pdf}")
                
        except Exception as e:
            print(f"处理 {filename} 时出错: {str(e)}")
        finally:
            # 6. 清理临时文件（取消注释以启用清理）
            # shutil.rmtree(temp_dir, ignore_errors=True)
            pass

def compile_tex(working_dir, tex_file):
    """编译LaTeX文件"""
    commands = [
        ['xelatex', '-interaction=nonstopmode', tex_file],
        # 如果需要正确处理引用，可取消注释下面两行
        # ['xelatex', '-interaction=nonstopmode', tex_file],
        # ['xelatex', '-interaction=nonstopmode', tex_file]
    ]
    
    for cmd in commands:
        result = subprocess.run(
            cmd,
            cwd=working_dir,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            text=True
        )
        
        if result.returncode != 0:
            # 保存错误日志
            log_file = working_dir / "compile_error.log"
            with open(log_file, 'w', encoding='utf-8') as f:
                f.write(result.stdout)
                f.write("\n\n===== ERRORS =====\n\n")
                f.write(result.stderr)
            
            raise RuntimeError(f"LaTeX编译失败。错误日志保存于: {log_file}")

if __name__ == "__main__":
    # 配置路径
    TEMPLATE_PATH = "template.tex"  # 您的模板文件路径
    INPUT_DIR = "figures"           # 包含.pdf_tex和.pdf文件的目录
    OUTPUT_DIR = "output_pdfs"      # 输出PDF的目录
    
    # 执行处理
    process_pdf_tex_files(TEMPLATE_PATH, INPUT_DIR, OUTPUT_DIR)
    print("\n处理完成!")